<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型对象</title>
</head>
<body>
    
</body>
</html>
<script>
    /*
        创建一个构造函数
    */
    function MyClass(){

    }

    // 向MyClass的原型中添加一个name
    MyClass.prototype.name = "我是原型中的名字";

    var mc = new MyClass();
    mc.age = 18;
    mc.__proto__.gender = "男";
    // console.log(mc.name);

    // 使用in检查对象中是否含有某个属性时，如果对象中没有 但 原型对象中有，也会返回true
    // console.log("name" in mc);

    // 可以使用对象的hasOwnProperty() 来检查对象自身是否含有该属性
    // 使用该方法只有当对象自身中含有该属性时，才会返回 true；
    console.log(mc.hasOwnProperty("name")); // false
    console.log(mc.hasOwnProperty("age"));  // true
    
    /*
        原型对象也是对象，所以他也有原型，
            当我们使用一个对象的属性或方法时，会先在自身中寻找，
                1️⃣ 自身中如果有，则直接使用
                2️⃣ 如果没有则去原型对象中寻找，如果原型对象中有，则使用
                3️⃣ 如果没有，则去原型的原型中寻找，直到找到Obje对象的原型
                    Object对象的原型没有原型，如果在Object中依然没有找到，则返回ndefined
                                        (返回undefined的原因是寻找的是属性或方法) ↑ 
    */
    console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
</script>